#ifndef PARTICIPANTE_H
#define PARTICIPANTE_H

#include <QObject>
#include <QTcpSocket>
#include <QDialog>

class MarcadorPais;
class QMessageBox;
class Mensagem;
class EnviadorMensagem;

class Participante : public QObject
{

    Q_OBJECT

public:

    Participante(QString nome, QString endereco_ip, int porta_conexao);
    QTcpSocket* socket;
    inline QString getNome () { return this->nome; }
    static Participante* instance;
    inline bool vezJogador () { return this->jogador_atual == this->nome; }
    QString getJogadorAtual () { return this->jogador_atual; }
    EnviadorMensagem* mensageiro;
    QList<Mensagem*> mensagens;

public slots:

    void processaPacote();
    void enviaMensagem (QString texto);
    void processaTrocaJogador(QString texto);
    void enviarMudancasAlocacao (QList<MarcadorPais*> paises_alterados);
    void encerrarTurno ();
    inline void erro (QAbstractSocket::SocketError error) { Q_UNUSED(error); qDebug () << this->socket->errorString(); }
    void sendMessage (Mensagem* mensagem);


signals:

    void novaMensagem(QString nome_usuario, QString mensagem);
    void objetivoEntregue (QString objetivo);
    void paisSorteado (QString texto);
    void trocaJogadorAtivo (QString texto);
    void tropasRecebidas (int novas_tropas);
    void mudancaTropasPais (QString texto);
    void atualizarJogadorAtual ();
    void mostrarDados(QString texto);
    void paisConquistado (QString texto);
    void jogadorAdicionado(QString texto);
    void jogoFinalizado ();

private:

    QString nome;
    QString endereco_ip;
    int porta_conexao;
    void processaPacoteChat (QString texto_pacote);
    QString jogador_atual;
    QMessageBox* aviso_vez_jogador;
};

#endif // PARTICIPANTE_H
